package com.cheng.example.book.advise151.chap3.client40;


/**
 * 建议40：匿名类的构造函数很特殊
 *
 * 它会首先调用父类有两个参数的构造函数，而不是无参构造，这是匿名类的构造函数与普通类的差别，但是这一点也确实鲜有人仔细琢磨，
 * 因为它的处理机制符合习惯呀，我传递两个参数，就是希望先调用父类有两个参数的构造，然后再执行我自己的构造函数，而Java的处理机制也正是如此处理的。
 *
 */
public class Calculator {
    enum Ops {
        ADD, SUB
    };

    private int i, j, result;

    // 无参构造
    public Calculator() {

    }

    // 有参构造
    public Calculator(int _i, int _j) {
        i = _i;
        j = _j;
    }

    // 设置符号，是加法运算还是减法运算
    protected void setOperator(Ops _ops) {
        result = _ops.equals(Ops.ADD) ? i + j : i - j;
    }

    // 取得运算结果
    public int getResult() {
        return result;
    }


    public static void main(String[] args) {
        Calculator c1 = new Calculator(1, 2) {
            {
                setOperator(Ops.ADD);
            }
        };
        System.out.println(c1.getResult());
    }

}

//加法计算
class Add extends Calculator{
    {
        setOperator(Ops.ADD);
    }
    //覆写父类的构造方法
    public Add(int _i, int _j){
        super(_i,_j);
    }
}

